home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 July / EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso / earcd / dev / mui / muiplusp.lha / Examples / TNListview.cpp < prev   
C/C++ Source or Header  |  1997-03-23  |  6KB  |  192 lines

  1. /* Simple example and test program to demonstrate use of template NListview
  2.    class */
  3.  
  4. #define MUIPP_DEBUG         // Turn debugging mode on for invalid use of classes
  5. //#define MUIPP_NOINLINES       // No inlines makes code compile quicker but the resulting
  6.                             // executable is larger and slower. Best to use this
  7.                             // option when developing and turn off for final release.
  8. #define MUIPP_TEMPLATES     // Allows use of MUI template classes
  9.  
  10. // This is the main C++ header file
  11.  
  12. #include <mui/NListview_mcc.hpp>
  13.  
  14. #include <inline/exec.h>
  15.  
  16. // These objects are inserted directly into the listview. Using template
  17. // listview means that the objects are retrieved and inserted as Person
  18. // objects (ie there is no need to convert to/from void *).
  19.  
  20. class Person
  21. {
  22. public:
  23.     Person (const char *_name)
  24.     {
  25.         name = (char *)_name;
  26.     }
  27.  
  28.     char *name;
  29. };
  30.  
  31. typedef ULONG (*HookFunction)();
  32.  
  33. struct IntuitionBase *IntuitionBase = NULL;
  34. struct Library *MUIMasterBase = NULL;
  35.  
  36. // Hook function to display Person object in listview
  37.  
  38. void
  39. DisplayPerson (void)
  40. {
  41.     register Person *a1 asm("a1"); Person *person = a1;
  42.     register char **a2 asm("a2"); char **column = a2;
  43.  
  44.     column[0] = person->name;
  45. }
  46.  
  47. struct Hook displayHook = {{NULL, NULL}, (HookFunction)DisplayPerson, NULL, NULL};
  48.  
  49. // Although the listview is passed by value it is actually passed by reference
  50. // always. This is because the class is only a wrapper to the BOOPSI class
  51. // and only has one attribute - the BOOPSI object pointer. Hence, it is the
  52. // equivalent of passing an Object * on the stack.
  53.  
  54. void
  55. PrintPersonList (CTMUI_NListview<Person> list)
  56. {
  57.     // You can use Length() or Entries() to get the length of a list
  58.  
  59.     int numPeople = list.Length();
  60.  
  61.     printf ("Number of people in list = %d\n", numPeople);
  62.  
  63.     // You can treat NListviews just like arrays!!
  64.  
  65.     for (int i = 0; i < numPeople; i++)
  66.     {
  67.         printf ("%d %s\n", i, list[i].name);
  68.     }
  69. }
  70.  
  71. int
  72. main (void)
  73. {
  74.     // Open libraries required
  75.  
  76.     if ((IntuitionBase = (struct IntuitionBase *)OpenLibrary ("intuition.library", 0)) == NULL)
  77.     {
  78.         printf ("Could not open intuition.library\n");
  79.         return 10;
  80.     }
  81.  
  82.     if ((MUIMasterBase = OpenLibrary ("muimaster.library", 0)) == NULL)
  83.     {
  84.         printf ("Could not open muimaster.library\n");
  85.         return 10;
  86.     }
  87.  
  88.     // Declare template NListview of type Person to display list of people
  89.     // NOTE: This does no initialization, it's just a declaration.
  90.  
  91.     CTMUI_NListview<Person> list;
  92.  
  93.     CMUI_Window window;
  94.  
  95.     // Create Application object. I am not using any shortcuts here to create
  96.     // the objects. I actually prefer the layout like this than when using
  97.     // shortcuts. If you prefer the old way of creating objects by using the
  98.     // shortcuts then you can still do this. See the shortcuts.cpp example
  99.     // for details as some shortcuts have had to change name so as not to clash
  100.     // with class member functions.
  101.  
  102.     CMUI_Application app
  103.     (
  104.         MUIA_Application_Title,         "TNListview",
  105.         MUIA_Application_Author,        "Nicholas Allen",
  106.         MUIA_Application_Base,          "TEST",
  107.         MUIA_Application_Copyright,     "AllenSoft",
  108.         MUIA_Application_Description,   "Test Program For Template NListview class",
  109.         MUIA_Application_Version,       "$VER: Test 1.0 (17.9.96)",
  110.         SubWindow, window = CMUI_Window
  111.         (
  112.             MUIA_Window_Title, "Test Program For Template NListview class",
  113.             MUIA_Window_ID, 10,
  114.             WindowContents, CMUI_VGroup
  115.             (
  116.                 Child, list = CTMUI_NListview<Person>
  117.                 (
  118.                     MUIA_NList_DisplayHook, &displayHook,
  119.                     MUIA_CycleChain, 1,
  120.                     MUIA_ShortHelp, "NListview created using templates!!",
  121.                     TAG_DONE
  122.                 ),
  123.                 TAG_DONE
  124.             ),
  125.             TAG_DONE
  126.         ),
  127.         TAG_DONE        // Don't forget these if you're not using shortcuts!
  128.     );
  129.  
  130.     // Any MUI object created as a C++ class can be tested for validity by
  131.     // calling its IsValid() method. This method just checks that the
  132.     // BOOPSI object pointer is not NULL.
  133.  
  134.     if (!app.IsValid())
  135.     {
  136.         printf ("Could not create application!\n");
  137.         return 10;
  138.     }
  139.  
  140.     // Insert some new people into the listview!!
  141.  
  142.     list.InsertBottom(new Person ("Nick"));
  143.     list.InsertBottom(new Person ("Dom"));
  144.     list.InsertBottom(new Person ("Mart"));
  145.     list.InsertBottom(new Person ("Nicky"));
  146.  
  147.     // This only copies 4 bytes onto stack!! It is the same as passing a
  148.     // BOOPSI Object *
  149.  
  150.     PrintPersonList (list);
  151.  
  152.     // Setup close window notification.
  153.     // Because Notify() is a variable args method we have to pass sva as the
  154.     // first parameter. Failing to do this will result in an error at
  155.     // COMPILE time so there won't be any weird crashes by forgetting to do
  156.     // this.
  157.  
  158.     window.Notify(sva, MUIA_Window_CloseRequest, TRUE,
  159.                   app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
  160.  
  161.     window.SetOpen(TRUE);
  162.  
  163.     ULONG sigs = 0;
  164.     BOOL running = TRUE;
  165.  
  166.     while (running)
  167.     {
  168.         switch (app.NewInput(&sigs))
  169.         {
  170.             case MUIV_Application_ReturnID_Quit:
  171.                 running = FALSE;
  172.             break;
  173.         }
  174.  
  175.         if (sigs)
  176.         {
  177.             sigs = Wait (sigs | SIGBREAKF_CTRL_C);
  178.             if (sigs & SIGBREAKF_CTRL_C) break;
  179.         }
  180.     }
  181.  
  182.     // This disposes of the application and all windows and objects in the
  183.     // windows.
  184.  
  185.     app.Dispose();
  186.  
  187.     CloseLibrary ((struct Library *)IntuitionBase);
  188.     CloseLibrary (MUIMasterBase);
  189.  
  190.     return 0;
  191. }
  192.